package com.mww.chatroom.component;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

//通过这个类来记录当前用户在线的状态,维护了userId 和 WebSocketSession之间的关系
@Component
public class OnlineUserManager {
    //进行hash表 的操作是多线程的
    //此处这个哈希表需要考虑线程安全问题
    private ConcurrentHashMap<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>();
    //1)用户上线
    public void online(int userId, WebSocketSession session) {
        if(sessions.get(userId) != null){
            //考虑多开的情况，前一个用户已经登陆，后一个用户会登录失败
            //此时说明用户已经再现了，登陆失败，不会记录这个映射关系
            //不吉利映射关系后续就收不到任何消息，毕竟此处通过映射关系实现消息转发的
            System.out.println("["+userId+"]"+"已经被登录，登陆失败");
            return;
        }
        this.sessions.put(userId, session);
        System.out.println("["+userId+"]"+"上线 ");
    }


    //2)用户下线
    public void offline(int userId,WebSocketSession session) {
        WebSocketSession existSession = this.sessions.get(userId);
        //此处代码是针对多开情况的处理
        if(existSession == session){
            this.sessions.remove(userId);
            System.out.println("["+userId+"]"+"下线 ");
        }

    }





    //3）根据userId获取到WebSocketSession
    public WebSocketSession getSession(int userId) {
        return this.sessions.get(userId);
    }
}
